package bomberman.modelo.personajes;

import org.jdom2.Element;

import bomberman.modelo.armas.TiraMolotov;
import bomberman.modelo.mapa.Casillero;
import bomberman.modelo.mapa.Direccion;
import bomberman.modelo.observadores.Observadores;

public class LopezReggaeAlado extends Enemigo {
	private static final int RESISTENCIA_STD  = 5;
	private static final int TEMPORIZADOR_STD = 0;
	private static final int VELOCIDAD_STD    = 1;
	private boolean          estoyVolando;
  
	public LopezReggaeAlado(Casillero unCasillero) {
		super(new TiraMolotov(), RESISTENCIA_STD, TEMPORIZADOR_STD, unCasillero, VELOCIDAD_STD);
		estoyVolando = false;
	}
  
	@Override
	public void moverEste() {
		setDireccion(Direccion.ESTE);
		Casillero ubicacionActual = this.getUbicacion();
		Casillero ubicacionFutura = ubicacionActual.getVecino(Direccion.ESTE);
		
		if (ubicacionFutura != null) {
			if (ubicacionFutura.esCaminablePor(this)) {
				mover(ubicacionFutura);
				estoyVolando = false;
			} else {
				volarEste();
			}
		}
		
		Observadores.notificar(this);
	}
  
	private void volarEste() {
		Casillero ubicacionActual = getUbicacion();
		Casillero ubicacionFutura = ubicacionActual.getVecino(Direccion.ESTE);
		
		if (ubicacionFutura != null) {
			if (ubicacionFutura.esSobrevolable()) {
				volar(ubicacionFutura);
				estoyVolando = true;
			}
		}
		
		Observadores.notificar(this);
	}
  
	@Override
	public void moverOeste() {
		setDireccion(Direccion.OESTE);
		Casillero ubicacionActual = getUbicacion();
		Casillero ubicacionFutura = ubicacionActual.getVecino(Direccion.OESTE);
		
		if (ubicacionFutura != null) {
			if (ubicacionFutura.esCaminablePor(this)) {
				mover(ubicacionFutura);
				estoyVolando = false;
			} else {
				volarOeste();
			}
		}
		
		Observadores.notificar(this);
	}
  
	private void volarOeste() {
	    Casillero ubicacionActual = this.getUbicacion();
	    Casillero ubicacionFutura = ubicacionActual.getVecino(Direccion.OESTE);
	    if (ubicacionFutura != null) {
	    	if (ubicacionFutura.esSobrevolable()) {
	    		volar(ubicacionFutura);
	    		estoyVolando = true;
	    	}
	    }
	    
	    Observadores.notificar(this);
	}
  
	@Override
	public void moverNorte() {
    	setDireccion(Direccion.NORTE);
    	Casillero ubicacionActual = getUbicacion();
    	Casillero ubicacionFutura = ubicacionActual.getVecino(Direccion.NORTE);
    	if (ubicacionFutura != null) {
    		if (ubicacionFutura.esCaminablePor(this)) {
    			mover(ubicacionFutura);
    			estoyVolando = false;
    		} else {
    			volarNorte();
    		}
    	}
    	
    	Observadores.notificar(this);
	}
  
	private void volarNorte() {
	    Casillero ubicacionActual = getUbicacion();
	    Casillero ubicacionFutura = ubicacionActual.getVecino(Direccion.NORTE);
	    if (ubicacionFutura != null) {
	    	if (ubicacionFutura.esSobrevolable()) {
	    		volar(ubicacionFutura);
	    		estoyVolando = true;
	    	}
	    }
	    
	    Observadores.notificar(this);
	}
  
	@Override
	public void moverSur() {
		setDireccion(Direccion.SUR);
		Casillero ubicacionActual = getUbicacion();
		Casillero ubicacionFutura = ubicacionActual.getVecino(Direccion.SUR);
		if (ubicacionFutura != null) {
			if (ubicacionFutura.esCaminablePor(this)) {
				mover(ubicacionFutura);
				estoyVolando = false;
			} else {
				volarSur();
			}
		}
	
		Observadores.notificar(this);
	}
  
	private void volarSur() {
	    Casillero ubicacionActual = getUbicacion();
	    Casillero ubicacionFutura = ubicacionActual.getVecino(Direccion.SUR);
	    if (ubicacionFutura != null) {
	    	if (ubicacionFutura.esSobrevolable()) {
	    		volar(ubicacionFutura);
	    		estoyVolando = true;
	    	}
	    }
	    
	    Observadores.notificar(this);
	}
  
	protected void volar(Casillero casilleroFinal) {
		if (estoyVolando) {
			getUbicacion().salgoVolando(this);
		} else {
			getUbicacion().salgoCaminando(this);
		}
		
		casilleroFinal.entroVolando(this);
		setUbicacion(casilleroFinal);
	}
  
	@Override
	protected void mover(Casillero casilleroFinal) {
		if (estoyVolando) {
			getUbicacion().salgoVolando(this);
		} else {
			getUbicacion().salgoCaminando(this);
		}
		
		casilleroFinal.entroCaminando(this);
		setUbicacion(casilleroFinal);
	}
  
	@Override
	public boolean esCaminablePor(Personaje unPersonaje) {
		return estoyVolando;
	}
  
	@Override
	public boolean esSobrevolable() {
		return !estoyVolando;
	}
  
	 @Override
	  public boolean esBalisticamentePermeable() {
	    return this.estoyVolando;
	  }
	
	@Override
	public Element serializar() {
		Element eLopezReggaeAlado = new Element("LopezReggaeAlado");
		return super.serializar(eLopezReggaeAlado);
	}
  
	public static LopezReggaeAlado recuperar(Element nodoLopezReggaeAlado, Casillero cas) {
	    int resistencia = Integer.parseInt(nodoLopezReggaeAlado.getAttributeValue("Resistencia"));
	    int velocidad = Integer.parseInt(nodoLopezReggaeAlado.getAttributeValue("Velocidad"));
	    int temporizador = Integer.parseInt(nodoLopezReggaeAlado.getAttributeValue("Temporizador"));
	    Direccion direccion = Direccion.valueOf(nodoLopezReggaeAlado.getAttributeValue("Direccion"));
	    
	    LopezReggaeAlado nuevoLopezReggaeAlado = new LopezReggaeAlado(cas);
	    nuevoLopezReggaeAlado.setResistencia(resistencia);
	    nuevoLopezReggaeAlado.setVelocidad(velocidad);
	    nuevoLopezReggaeAlado.setTemporizador(temporizador);
	    nuevoLopezReggaeAlado.setDireccion(direccion);
	    
	    cas.setContenidoAlto(nuevoLopezReggaeAlado);
	    
	    return nuevoLopezReggaeAlado;
	}
}
